import errorCode from '@/utils/errorCode'

// 这里的vm，就是我们在vue文件里面的this，所以我们能在这里获取vuex的变量，比如存放在里面的token变量
const install = (Vue, vm) => {
	// 此为自定义配置参数，具体参数见上方说明
	Vue.prototype.$u.http.setConfig({
		baseUrl: 'http://localhost:8888', // 请求的本域名
		dataType: 'json', // 设置为json，返回后会对数据进行一次JSON.parse()
		showLoading: true, // 是否显示请求中的loading
		loadingText: '请求中...', // 请求loading中的文字提示
		loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
		originalData: true, // 是否在拦截器中返回服务端的原始数据
		loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
		header: { // 配置请求头信息
			'content-type': 'application/json;charset=UTF-8'
		},
	});

	// 请求拦截部分，如配置，每次请求前都会执行
	Vue.prototype.$u.http.interceptor.request = (config) => {
		// 是否需要设置 token
		const isToken = (config.headers || {}).isToken === false
		if (vm.vuex_token && !isToken) {
			config.header.Authorization = 'Bearer ' + vm.vuex_token // 让每个请求携带自定义token 请根据实际情况自行修改
		}
		// get请求映射params参数
		if (config.method === 'get' && config.params) {
			let url = config.url + '?'
			for (const propName of Object.keys(config.params)) {
				const value = config.params[propName]
				var part = encodeURIComponent(propName) + "="
				if (value !== null && typeof(value) !== "undefined") {
					if (typeof value === 'object') {
						for (const key of Object.keys(value)) {
							if (value[key] !== null && typeof(value[key]) !== 'undefined') {
								let params = propName + '[' + key + ']'
								let subPart = encodeURIComponent(params) + '='
								url += subPart + encodeURIComponent(value[key]) + '&'
							}
						}
					} else {
						url += part + encodeURIComponent(value) + "&"
					}
				}
			}
			url = url.slice(0, -1)
			config.params = {}
			config.url = url
		}
		return config
	}
	// 响应拦截，如配置，每次请求结束都会执行本方法
	Vue.prototype.$u.http.interceptor.response = (res) => {
		// 未设置状态码则默认成功状态
		const code = res.data.code || 200
		// 获取错误信息
		const msg = errorCode[code] || res.data.message || errorCode['default']
		if (code === 401) {
			Vue.prototype.$u.toast('请先登录呦亲')
			return Promise.reject(new Error(msg))
		} else if (code === 500) {
			Vue.prototype.$u.toast(msg)
			return Promise.reject(new Error(msg))
		} else if (code !== 200) {
			return Promise.reject('error')
		} else {
			return res.data
		}
	}
}

export default {
	install
}
